package com.colloquial.arithcode2;

import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.IOException;
import java.util.ArrayList;

import model.registro.Registro;


// la idea basica de que extienda de "Registro" es que permite guadar 
// las cosas en un archivo segun el modelo 
public class PPMContexto extends Registro{
    private String contexto;
    private ArrayList<RegistroSimbolos> arraySimbolos = new ArrayList<RegistroSimbolos>(65538);
   
       
    
    //constructor de un nuevo contexto; se le pasa al constructor el contexto,
    //el constructor solamente debe agregar un simbolo de escape
    // y lo agrega a la lista de Registros
    public PPMContexto(String NewContexto){
    	this.contexto = new String(NewContexto);
    	RegistroSimbolos rs = new RegistroSimbolos();
		rs.setProbabilidad(0);
		for (int i = 0; i<= 65537; i++){
			//System.out.println(i);
			arraySimbolos.add(i,rs);
			
		}
		/*		
		RegistroSimbolos rs2 = new RegistroSimbolos();		
		rs2.setProbabilidad(1);
		arraySimbolos.set(65536, rs2);
		
		*/
		//rs = new RegistroSimbolos();
		//rs = arraySimbolos.get(65536);
		//rs.setProbabilidad(1);
    	//this.arraySimbolos.add(new RegistroSimbolos(ESC.toString()));
    }
    
    // constructor por defecto
    public PPMContexto() {
	}
    
    public String getContexto() {
		return contexto;
	}
	public void setContexto(String contexto) {
		this.contexto = contexto;
	}
	public ArrayList<RegistroSimbolos> getArraySimbolos() {
 		return arraySimbolos;
	}
	public void setArraySimbolos(ArrayList<RegistroSimbolos> simbolo) {
		this.arraySimbolos = simbolo;
	}
	
	public int getTamanioRegistro() {
		//return contexto.getBytes().length + arraySimbolos.size()
		return contexto.getBytes().length + arraySimbolos.size()*Long.SIZE / 8 + ConversionesTiposDatos.sizeOfInt();	
	}

	public byte[] convertirRegistroABytes() throws IOException{

		ByteArrayOutputStream bytesRegistro = new ByteArrayOutputStream();
		DataOutputStream output = new DataOutputStream(bytesRegistro);
	
		//output.writeInt(arraySimbolos.size());
        
//		output.writeInt(contexto.getBytes().length);
        output.writeInt(contexto.length());
        output.write(contexto.getBytes());
		
		int i = 0;
		for(RegistroSimbolos reg : arraySimbolos){
			//output.writeInt(reg.getTamanioRegistro());
			//System.out.println(i);
			output.write(reg.convertirRegistroABytes());
			i++;
		}
		
		/*
		
		
		for (int i = 0; i < arraySimbolos.size(); i++) {
			output.writeInt(arraySimbolos.get(i).getTamanioRegistro());
			System.out.println(i);
			output.write(arraySimbolos.get(i).convertirRegistroABytes());
		}
		*/
        
		
		
        
        return bytesRegistro.toByteArray();

	}

	public void convertirBytesARegistro(byte[] xInput) throws IOException {

		ByteArrayInputStream bytesRegistro = new ByteArrayInputStream(xInput);
		DataInputStream input = new DataInputStream(bytesRegistro);

		arraySimbolos.clear();

		int tamanioPalabra = input.readInt();
		byte[] bytesTermino = new byte[tamanioPalabra];
		input.read(bytesTermino);
		contexto = new String(bytesTermino);

		//int tamanioList= input.readInt();
		// System.out.println("el tamanio de la lista es: "+tamanioList);
		for (int i = 0; i <= 65537; i++) {
			//System.out.println(i);
			//int tamanioRegistroSimbolo = input.readInt();
			byte[] registroBytes = new byte[Long.SIZE / 8];
			//byte[] registroBytes = new byte[tamanioRegistroSimbolo];
			RegistroSimbolos rs = new RegistroSimbolos();
			input.read(registroBytes);
			rs.convertirBytesARegistro(registroBytes);

			arraySimbolos.add(i, rs);
		}

	}

}
